//
//  LoginService.m
//  CoolRollerSkating
//
//  Created by WSL on 15/11/20.
//  Copyright © 2015年 Coollang. All rights reserved.
//

#import "LoginService.h"

#import <SMS_SDK/SMSSDK.h>
#import <ShareSDK/ShareSDK.h>
#import "WXApi.h"
#import <TencentOpenAPI/QQApiInterface.h>
#import <TencentOpenAPI/TencentOAuth.h>
#import <ShareSDKExtension/ShareSDK+Extension.h>

#import <ShareSDKExtension/SSEThirdPartyLoginHelper.h>
#import <SMS_SDK/SMSSDK.h>
#import <SMS_SDK/Extend/SMSSDK+AddressBookMethods.h>
#import <SMS_SDK/Extend/SMSSDK+ExtexdMethods.h>
#import "MBProgressHUD+HudTools.h"

#import "User.h"
#import "DataModel.h"

#import "UIView+Frame.h"
#import "UserEquipModel.h"

static NSString * const kVarifyCodeId = @"VarifyCodeId";

@interface LoginService ()

@property (copy, nonatomic) NSArray *areaArray;
@property (copy, nonatomic) NSString *defaultCode;


@end

@implementation LoginService

- (void)getSMSVarifyCode:(NSString *)phone {
    [self varifyPhone:phone getVarifyCodeBlock:^(BOOL successed, NSString *info) {
        
        if (successed) {
            [SMSSDK getVerificationCodeByMethod:SMSGetCodeMethodSMS phoneNumber:phone zone:@"+86" customIdentifier:kVarifyCodeId result:^(NSError *error) {
                if (!error) {
                    self.varifyCodeblock(true,@"");
                } else {
                    self.varifyCodeblock(false,@"获取失败");
                }
            }];
        } else {
            self.varifyCodeblock(false,@"手机号码非法，请重新填写");
        }
    }];
}

- (void)loginByWeChatWithLoginByThirdPartPlatformBlock:(LoginByThirdPartPlatformBlock)block
{
    [self loginByThirdPartPlatform:SSDKPlatformSubTypeWechatSession completionBlock:block];
}

- (void)loginByFacebookWithLoginByThirdPartPlatformBlock:(LoginByThirdPartPlatformBlock)block
{
    [self loginByThirdPartPlatform:SSDKPlatformTypeFacebook completionBlock:block];
}

- (void)loginByThirdPartPlatform:(SSDKPlatformType)type completionBlock:(LoginByThirdPartPlatformBlock)block
{
    [SSEThirdPartyLoginHelper loginByPlatform:type onUserSync:^(SSDKUser *user, SSEUserAssociateHandler associateHandler){
        associateHandler(user.uid, user, user);
        NSString *platformType = @"2";
        if (type == SSDKPlatformTypeFacebook) {
            platformType = @"5";
        }
        YFLoginApi *api = [YFLoginApi loginWithThridPartplatform:platformType credential:user.credential.uid token:user.credential.token];
        
        NSLog(@"platformType: %@ \n openId: %@ \n token:%@", platformType, user.credential.uid, user.credential.token);
        [[YFNetworkingService sharedInstance] sendRequest:api callback:^(BOOL success, id result, NSError *error) {
            NSString *userId = @"";
            BOOL isFirst = NO;
            if (success) {
                if ([[result responseInfo] isKindOfClass:[NSDictionary class]]) {
                    userId = [[result responseInfo] objectForKey:@"UserId"];
                    isFirst = [[[result responseInfo] objectForKey:@"FirstLogin"] isEqualToString:@"1"];
                }
                [YFUserApi requestGetUserInfoWithComplate:^(BOOL success, UserInforItem *infoitem) {
                    NSLog(@"responseInfo = %@",infoitem);
                    if (success) {
                        [DataModel saveLastLoginAccountID:user.credential.uid];
                        User *user = [User getLastUser];
                        RLMRealm *realm = [RLMRealm defaultRealm];
                        [realm beginWriteTransaction];
                        user.userInforItem = infoitem;
                        [realm commitWriteTransaction];
                        block(YES, NSLocalizedString(@"Success", nil),isFirst);
                    }else{
                        block(NO, NSLocalizedString(@"Log on invalid", nil),isFirst);
                    }
                }];
            } else {
                block(NO, NSLocalizedString(@"Network anomaly", nil),isFirst);
            }
        }];
        
    } onLoginResult:^(SSDKResponseState state, SSEBaseUser *user, NSError *error) {
        if (state == SSDKResponseStateSuccess)
        {
            [SSEThirdPartyLoginHelper logout:user];
        }
        else if (state == SSDKResponseStateFail)
        {
            block(false,NSLocalizedString(@"Authorization failed", nil),NO);
        } else if (state == SSDKResponseStateCancel)
        {
            block(false,NSLocalizedString(@"Authorization canceled", nil),NO);
        }
        
    }];
}

- (void)loginByEmail:(NSString *)email password:(NSString *)password completionBlock:(LoginCompleteBlock)block
{
    
    YFLoginApi *loginApi = [YFLoginApi emailSignInOrSignUp:YES email:email password:password];
    [[YFNetworkingService sharedInstance] sendRequest:loginApi callback:^(BOOL success, id result, NSError *error) {
        if (success) {
//           NSString *userId = [[result responseInfo] objectForKey:@"UserID"];
           BOOL isFirst = [[[result responseInfo] objectForKey:@"FirstLogin"] integerValue] == 1;
            [YFUserApi requestGetUserInfoWithComplate:^(BOOL success, UserInforItem *infoitem) {
                if (success) {
                    [DataModel saveLastLoginAccountID:email];
                    User *user = [User getLastUser];
                    RLMRealm *realm = [RLMRealm defaultRealm];
                    [realm beginWriteTransaction];
                    user.userInforItem = infoitem;
                    user.userInforItem.email = email;
                    [realm commitWriteTransaction];
                    block(true,isFirst);
                }else{
                    block(false,isFirst);
                }
            }];
        } else {
            block(false,NO);
        }
    }];
}

- (void)loginByPhone:(NSString *)phoneNum varifyNum:(NSString *)varifyNum completeBlock:(LoginCompleteBlock)block{
    
    [YFLoginApi loginApiByPhone:phoneNum verifyCode:varifyNum withComplete:^(NSString *userId, BOOL isFirstLogin, NSError *error) {
        if (error == nil) {
            [YFUserApi requestGetUserInfoWithComplate:^(BOOL success, UserInforItem *infoitem) {
                if (success) {
                    [DataModel saveLastLoginAccountID:phoneNum];
                    User *user = [User getLastUser];
                    RLMRealm *realm = [RLMRealm defaultRealm];
                    [realm beginWriteTransaction];
                    user.userInforItem = infoitem;
                    user.userInforItem.phoneNum = phoneNum;
                    [realm commitWriteTransaction];
                    block(true,isFirstLogin);
                }else{
                    block(false,isFirstLogin);
                }
            }];
        } else {
            block(false,isFirstLogin);
        }
    }];

}

- (void)varifyPhone:(NSString *)phone getVarifyCodeBlock:(GetVarifyCodeBlock)block{
    [self setTheLocalAreaCode];
    [SMSSDK getCountryZone:^(NSError *error, NSArray *zonesArray) {
        if (!error) {
            NSLog(@"get the area code sucessfully");
            _areaArray = [NSMutableArray arrayWithArray:zonesArray];
            block([self ensureThePhoneNum:phone],@"");
        } else {
            NSLog(@"failed to get the area code _%@",[error.userInfo objectForKey:@"getZone"]);
        }
        
    }];
    
}

-(void)setTheLocalAreaCode
{
    NSLocale *locale = [NSLocale currentLocale];
    
    NSDictionary *dictCodes = [NSDictionary dictionaryWithObjectsAndKeys:@"972", @"IL",
                               @"93", @"AF", @"355", @"AL", @"213", @"DZ", @"1", @"AS",
                               @"376", @"AD", @"244", @"AO", @"1", @"AI", @"1", @"AG",
                               @"54", @"AR", @"374", @"AM", @"297", @"AW", @"61", @"AU",
                               @"43", @"AT", @"994", @"AZ", @"1", @"BS", @"973", @"BH",
                               @"880", @"BD", @"1", @"BB", @"375", @"BY", @"32", @"BE",
                               @"501", @"BZ", @"229", @"BJ", @"1", @"BM", @"975", @"BT",
                               @"387", @"BA", @"267", @"BW", @"55", @"BR", @"246", @"IO",
                               @"359", @"BG", @"226", @"BF", @"257", @"BI", @"855", @"KH",
                               @"237", @"CM", @"1", @"CA", @"238", @"CV", @"345", @"KY",
                               @"236", @"CF", @"235", @"TD", @"56", @"CL", @"86", @"CN",
                               @"61", @"CX", @"57", @"CO", @"269", @"KM", @"242", @"CG",
                               @"682", @"CK", @"506", @"CR", @"385", @"HR", @"53", @"CU",
                               @"537", @"CY", @"420", @"CZ", @"45", @"DK", @"253", @"DJ",
                               @"1", @"DM", @"1", @"DO", @"593", @"EC", @"20", @"EG",
                               @"503", @"SV", @"240", @"GQ", @"291", @"ER", @"372", @"EE",
                               @"251", @"ET", @"298", @"FO", @"679", @"FJ", @"358", @"FI",
                               @"33", @"FR", @"594", @"GF", @"689", @"PF", @"241", @"GA",
                               @"220", @"GM", @"995", @"GE", @"49", @"DE", @"233", @"GH",
                               @"350", @"GI", @"30", @"GR", @"299", @"GL", @"1", @"GD",
                               @"590", @"GP", @"1", @"GU", @"502", @"GT", @"224", @"GN",
                               @"245", @"GW", @"595", @"GY", @"509", @"HT", @"504", @"HN",
                               @"36", @"HU", @"354", @"IS", @"91", @"IN", @"62", @"ID",
                               @"964", @"IQ", @"353", @"IE", @"972", @"IL", @"39", @"IT",
                               @"1", @"JM", @"81", @"JP", @"962", @"JO", @"77", @"KZ",
                               @"254", @"KE", @"686", @"KI", @"965", @"KW", @"996", @"KG",
                               @"371", @"LV", @"961", @"LB", @"266", @"LS", @"231", @"LR",
                               @"423", @"LI", @"370", @"LT", @"352", @"LU", @"261", @"MG",
                               @"265", @"MW", @"60", @"MY", @"960", @"MV", @"223", @"ML",
                               @"356", @"MT", @"692", @"MH", @"596", @"MQ", @"222", @"MR",
                               @"230", @"MU", @"262", @"YT", @"52", @"MX", @"377", @"MC",
                               @"976", @"MN", @"382", @"ME", @"1", @"MS", @"212", @"MA",
                               @"95", @"MM", @"264", @"NA", @"674", @"NR", @"977", @"NP",
                               @"31", @"NL", @"599", @"AN", @"687", @"NC", @"64", @"NZ",
                               @"505", @"NI", @"227", @"NE", @"234", @"NG", @"683", @"NU",
                               @"672", @"NF", @"1", @"MP", @"47", @"NO", @"968", @"OM",
                               @"92", @"PK", @"680", @"PW", @"507", @"PA", @"675", @"PG",
                               @"595", @"PY", @"51", @"PE", @"63", @"PH", @"48", @"PL",
                               @"351", @"PT", @"1", @"PR", @"974", @"QA", @"40", @"RO",
                               @"250", @"RW", @"685", @"WS", @"378", @"SM", @"966", @"SA",
                               @"221", @"SN", @"381", @"RS", @"248", @"SC", @"232", @"SL",
                               @"65", @"SG", @"421", @"SK", @"386", @"SI", @"677", @"SB",
                               @"27", @"ZA", @"500", @"GS", @"34", @"ES", @"94", @"LK",
                               @"249", @"SD", @"597", @"SR", @"268", @"SZ", @"46", @"SE",
                               @"41", @"CH", @"992", @"TJ", @"66", @"TH", @"228", @"TG",
                               @"690", @"TK", @"676", @"TO", @"1", @"TT", @"216", @"TN",
                               @"90", @"TR", @"993", @"TM", @"1", @"TC", @"688", @"TV",
                               @"256", @"UG", @"380", @"UA", @"971", @"AE", @"44", @"GB",
                               @"1", @"US", @"598", @"UY", @"998", @"UZ", @"678", @"VU",
                               @"681", @"WF", @"967", @"YE", @"260", @"ZM", @"263", @"ZW",
                               @"591", @"BO", @"673", @"BN", @"61", @"CC", @"243", @"CD",
                               @"225", @"CI", @"500", @"FK", @"44", @"GG", @"379", @"VA",
                               @"852", @"HK", @"98", @"IR", @"44", @"IM", @"44", @"JE",
                               @"850", @"KP", @"82", @"KR", @"856", @"LA", @"218", @"LY",
                               @"853", @"MO", @"389", @"MK", @"691", @"FM", @"373", @"MD",
                               @"258", @"MZ", @"970", @"PS", @"872", @"PN", @"262", @"RE",
                               @"7", @"RU", @"590", @"BL", @"290", @"SH", @"1", @"KN",
                               @"1", @"LC", @"590", @"MF", @"508", @"PM", @"1", @"VC",
                               @"239", @"ST", @"252", @"SO", @"47", @"SJ", @"963", @"SY",
                               @"886", @"TW", @"255", @"TZ", @"670", @"TL", @"58", @"VE",
                               @"84", @"VN", @"1", @"VG", @"1", @"VI", nil];
    
    NSString *tt = [locale objectForKey:NSLocaleCountryCode];
    _defaultCode = [dictCodes objectForKey:tt];
    
    NSArray *languages = [NSLocale preferredLanguages];
    NSString *currentLanguage = [languages objectAtIndex:0];
    if ([currentLanguage rangeOfString:@"zh-Hans"].location != NSNotFound) {
        _defaultCode = @"86";
    }
    
}

-(BOOL)ensureThePhoneNum:(NSString *)phoneNum
{
    BOOL isMatch;
    int compareResult = 0;
    for (int i=0; i<_areaArray.count; i++)
    {
        NSDictionary* dict1=[_areaArray objectAtIndex:i];
        NSString* code1=[dict1 valueForKey:@"zone"];
        if ([code1 isEqualToString:_defaultCode])
        {
            compareResult=1;
            NSString* rule1=[dict1 valueForKey:@"rule"];
            NSPredicate* pred=[NSPredicate predicateWithFormat:@"SELF MATCHES %@",rule1];
            isMatch=[pred evaluateWithObject:phoneNum];
            
            break;
        }
    }
    return isMatch;
}

- (FUIAlertView *)AlertViewWithTitle:(NSString *)title message:(NSString *)message cancelButtonTitle:(NSString *)cancelTitle {
    NSString *messageStr = [NSString stringWithFormat:@"\n%@\n\n",message];
    FUIAlertView *alertView = [[FUIAlertView alloc] initWithTitle:title message:messageStr delegate:nil cancelButtonTitle:cancelTitle otherButtonTitles:nil, nil];
    
    [alertView customizeAppearance];
    UIButton *cancelButton = alertView.buttons[alertView.cancelButtonIndex];
    cancelButton.layer.borderColor = kSelectedColor.CGColor;
    [cancelButton setTitleColor:kSelectedColor forState:UIControlStateNormal];
    
    cancelButton.width = 120;
    
    return alertView;
}

- (BOOL)isInstallWechat{
    BOOL isInstall = [WXApi isWXAppInstalled];
    if (isInstall == NO) {
        isInstall = [ShareSDK isClientInstalled:SSDKPlatformTypeWechat];
    }
    return isInstall;
}

- (void)writeDataToDB{
    
}

@end
